package com.adee.netty.client;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

/**
 * java socket客户端程序（bio方式）与原始 linux socket对照
 *
 * 一、linux socket
 if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
 printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
 exit(0);
 }

 if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
 printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
 exit(0);
 }

 printf("send msg to server: \n");
 fgets(sendline, 4096, stdin);
 if( send(sockfd, sendline, strlen(sendline), 0) < 0)
 {
 printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
 exit(0);
 }
 if((rec_len = recv(sockfd, buf, MAXLINE,0)) == -1) {
 perror("recv error");
 exit(1);
 }

 以上原始linux socket客户端程序中，主要就三点：
 1.socket()函数，创建socketfd，此时socket状态是未连接、未监听、未绑定；
 2.connect()函数，将socket连接到远程地址的listen_socket，此时socket状态为已连接；
 3.send()/recv()函数，发送/接受字节序列。

 二、java socket
 在Java中，提供了两个类用于实现TCP通信程序：
 客户端：java.net.Socket 类表示。创建Socket对象，向服务端发出连接请求，服务端响应请求，两者建立连接开始通信。
 服务端：java.net.ServerSocket 类表示。创建ServerSocket对象，相当于开启一个服务，并等待客户端的连接。

 */
public class ClientSocketTest {
    public static void main(String[] args) {
        //socket对象初始化
        Socket socket = null;

        //输出流 os对象初始化
        OutputStream os = null;
        try {

            //1、创建Socket对象，它的第一个参数需要的是服务端的IP，第二个参数是服务端的端口
            InetAddress inet = InetAddress.getByName("127.0.0.1");
            // 相当于linux的socket()函数和connect()函数，创建socket并连接到远程地址
            socket = new Socket(inet,7000);//inet是服务端ip

            //2、获取一个输出流，用于写出要发送的数据
            os = socket.getOutputStream();

            //3、写出数据
            // 底层调用linux的send(sockfd, sendline, strlen(sendline), 0)函数
            // OutputStream和InputStream中都持有一个int类型的sockfd，通过调用send()/recv()函数来收发字节流
            os.write("你好，我是客户端小杨同学！".getBytes());

            //4、读数据
            InputStream is = socket.getInputStream();
//            System.out.println(new String(is.readAllBytes(), StandardCharsets.UTF_8));


        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4、释放资源,别忘了哦！！！！
            if(socket!=null){
                try {
                    socket.close();//关闭
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(os!=null){
                try {
                    os.close();//关闭
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
